<?php
/**
 * db_mssql.class.php
 * 
 * db_mysql数据库驱动,完成对mssql数据库的操作
 * 
 * @author lsl <470663151@qq.com> 
 * @copyright Copyright (c) 2012 lsl8966 Software Studio
 * @link http://www.cnblogs.com/lsl8966
 * @version $Id: AutoLoad.class.php 1.0 2012-01-18 22:48:01Z lsl $
 * @package core
 * @since 1.0
 */

if (!defined('IN_PDK')){
     exit();
    }

class db_mssql extends Base{
    
    /**
     * 单例模式实例化对象
     * 
     * @var object 
     */
     public static $_instance;
    
    /**
     * 数据库连接ID
     * 
     * @var object 
     */
     public $dbLink;
    
    /**
     * 事务处理开启状态
     * 
     * @var boolean 
     */
     public $Transactions;
    
    
    /**
     * 构造函数

     * 用于初始化运行环境,或对基本变量进行赋值
     * 
     * @access public 
     * @param array $params 数据库连接参数,如主机名,数据库用户名,密码等
     * @return boolean 
     */
     public function __construct($params = array()){
         // 检测参数信息是否完整
        if (!$params['host'] || !$params['username'] || !$params['dbname']){
             Controller :: halt('Mssql Server HostName or UserName or Password or DatabaseName is error in the config file!');
        }
        
         // 处理数据库端口
        if ($params['port'] && $params['port'] != 3306){
             //$params['host'] .= ':' . $params['port'];
        }
         // 实例化mysql连接ID
        $this -> dbLink = @sqlsrv_connect($params['host'],array('UID' => $params['username'] ,'PWD'=> $params['password'], 'Database' => $params['dbname']));
//         $stmt = sqlsrv_query($this->dbLink, "select [item_no]
//           ,[item_subno]
//           ,[item_name]
//           ,[item_subname]
//           ,[item_clsno]
//           ,[item_brand]
//           ,[item_brandname]
//           ,[unit_no]
//           ,[item_size]
//           ,[product_area]
//           ,[price]
//           ,[base_price]
//           ,[sale_price] from t_bd_item_info");
//         $resutl = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
//         var_dump($resutl);exit;
         if (!$this -> dbLink){
             Controller :: halt('Mssql Server connect fail! <br/>Error Message:' . mysql_error() . '<br/>Error Code:' . mysql_errno(), 'Warning');
         }else{
//             if (mysql_select_db($params['dbname'], $this -> dbLink)){
//                 // 设置数据库编码
//                mysql_query("SET NAMES {$params['charset']}", $this -> dbLink);
//                 if (version_compare($this -> getServerInfo(), '5.0.2', '>=')){
//                     mysql_query("SET SESSION SQL_MODE=''", $this -> dbLink);
//                     }
//                 }else{
//                    // 连接错误,提示信息
//                    Controller :: halt('Mssql Server can not connect database table. Error Code:' . mysql_errno() . ' Error Message:' . mysql_error(), 'Warning');
//                 }
         }
        
         return true;
     }
    
    /**
     * 执行SQL语句
     * 
     * SQL语句执行函数.
     * 
     * @access public 
     * @param string $sql SQL语句内容
     * @return mixed 
     */
     public function query($sql){
         // 参数分析
        if (!$sql || !$this -> dbLink){
             return false;
        }
        $sql = str_replace("`","",$sql);
         $result = sqlsrv_query($this -> dbLink,$sql);
		 
		 if ($result == false){
			 // 获取当前运行的controller及action名称
			$controllerId = pdk ::getControllerName();
			 $actionId = pdk ::getActionName();
			 Log :: write('[' . $controllerId . '][' . $actionId . '] SQL execute failed :' . $sql . ' Error Code:' . $this -> errno() . 'Error Message:' . $this -> error());
		 }
         // 日志操作,当调试模式开启时,将所执行过的SQL写入SQL跟踪日志文件,便于DBA进行MYSQL优化。若调试模式关闭,当SQL语句执行错误时写入日志文件
		 else if(defined('LOG_SQL') && LOG_SQL){
             // 获取当前运行的controller及action名称
             $controllerId = pdk ::getControllerName();
             $actionId = pdk ::getActionName();
             $sqlLogFile = 'sql_' . date('Y_m_d', $_SERVER['REQUEST_TIME']);

             if ($result){
                 Log :: write('[' . $controllerId . '][' . $actionId . ']:' . $sql, 'Normal', $sqlLogFile);
             }
		 }
        
         return $result;
     }
    
    /**
     * 获取mssql数据库服务器信息
     * 
     * @access public 
     * @return string 
     */
     public function getServerInfo(){
        
         if (!$this -> dbLink){
             return false;
             }
        
         return sqlsrv_server_info($this -> dbLink);
     }
    
    /**
     * 获取mssql错误描述信息
     * 
     * @access public 
     * @return string 
     */
     public function error(){
        
         return ($this -> dbLink) ? sqlsrv_errors($this -> dbLink) : sqlsrv_errors();
     }
    
    /**
     * 获取mssql错误信息代码
     * 
     * @access public 
     * @return int 
     */
     public function errno(){
        
         return  sqlsrv_errors($this -> dbLink);
     }
    
    /**
     * 通过一个SQL语句获取一行信息(字段型)
     * 
     * @access public 
     * @param string $sql SQL语句内容
     * @return mixed 
     */
     public function fetchRow($sql){
        
         // 参数分析
        if (!$sql){
             return false;
             }
        
         $result = $this -> query($sql);
        
         if (!$result){
             return false;
             }
        
         $rows = sqlsrv_fetch($result);
         sqlsrv_free_stmt($result);

         return $rows;
     }
    
    /**
     * 通过一个SQL语句获取全部信息(字段型)
     * 
     * @access public 
     * @param string $sql SQL语句
     * @return array 
     */
     public function getArray($sql){
        
         // 参数分析
        if (!$sql){
             return false;
         }
         $result = $this -> query($sql);
         if (!$result){
             return false;
         }
         $data = array();
         while($row = @sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) {
             $data[] = $row;
         }
         sqlsrv_free_stmt($result);
         return $data;
     }
    
    /**
     * 获取insert_id
     * 
     * @access public 
     * @return int 
     */
     public function insertId(){
        
//         return ($id = mssql_insert_id($this -> dbLink)) >= 0 ? $id : mssql_result($this -> query("SELECT last_insert_id()"));
     }
    
    /**
     * 开启事务处理
     * 
     * @access public 
     * @return boolean 
     */
     public function startTrans(){
        
         if ($this -> Transactions == false){
             if ($this -> query('BEGIN')){
                 $this -> Transactions = true;
                 }
             }
        
         return true;
     }
    
    /**
     * 提交事务处理
     * 
     * @access public 
     * @return boolean 
     */
     public function commit(){
        
         if ($this -> Transactions == true){
             if (sqlsrv_commit($this->dbLink)){
                 $this -> Transactions = false;
                 }
             }
        
         return true;
     }
    
    /**
     * 事务回滚
     * 
     * @access public 
     * @return boolean 
     */
     public function rollback(){
        
         if ($this -> Transactions == true){
             if (sqlsrv_rollback($this->dbLink)){
                 $this -> Transactions = false;
                 }
             }
         return true;
     }
    
    /**
     * 转义字符
     * 
     * @access public 
     * @param string $string 待转义的字符串
     * @return string 
     */
     public function escapeString($string = null){

     }
    
    /**
     * 析构函数
     * 
     * @access public 
     * @return void 
     */
     public function __destruct(){
        
         if ($this -> dbLink){
             @sqlsrv_close($this -> dbLink);
             }
     }
    
    /**
     * 单例模式
     * 
     * @access public 
     * @param array $params 数据库连接参数
     * @return object 
     */
     public static function getInstance($params){
        
         if (!self :: $_instance){
             self :: $_instance = new self($params);
             }
        
         return self :: $_instance;
     }
}
